package com.easylinkin.linkappapi.device.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.easylinkin.linkappapi.device.entity.Device;
import com.easylinkin.linkappapi.device.entity.DeviceInfo;
import com.easylinkin.linkappapi.device.entity.DeviceModel;
import com.easylinkin.linkappapi.device.entity.DeviceModelDto;
import com.easylinkin.linkappapi.device.entity.DeviceVo;
import com.easylinkin.linkappapi.device.entity.vo.CountByDffAttrVo;
import com.easylinkin.linkappapi.device.entity.vo.DeviceModelQueryVo;
import com.easylinkin.linkappapi.device.entity.vo.DeviceQueryVo;
import com.easylinkin.linkappapi.device.entity.vo.StatisticCountWithOnlineByTypeResult;
import com.easylinkin.linkappapi.device.vo.DeviceTypeCountVo;
import com.easylinkin.linkappapi.device.vo.DeviceStatisticsVo;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author TongJie
 * @since 2020-04-14
 */
public interface DeviceService extends IService<Device> {


    boolean add(Device device);

    Map<String,Object> deleteBatch (List<Device> deviceList);

    /**
     * 根据设备ids 查询被资产用到的 资产ids
     */
    List<String> selectAssetIdsByIds(List<String> ids);

    /**
     * 更新设备基础信息
     */
    boolean update(Device device);

    void getImportTemplate(HttpServletRequest request, HttpServletResponse response);

    void getImportTemplateSpace(HttpServletRequest request, HttpServletResponse response);

    /**
     * 导入数据
     *
     * @param file xls文件
     * @param device 对象-设备
     * @return 操作结果
     */
    Set importData(MultipartFile file, Device device);

    void deviceBindArea(MultipartFile file);

    void exportData(Device device, HttpServletRequest request, HttpServletResponse response);

    IPage<Device> selectDevicesPage(Page page, Device device);

    IPage<Device> selectPageByModelId(Page page, Device device);

    IPage<Device> selectDevicesPageFilter(Page page, Device device);

    List<Device> selectDevicesPageFilter(Device device);

    IPage<Device> selectDevicesFilterDifferBind(Page page, Device device);

    IPage<Device> selectDevicesWithAlarmRule(Page page, Device device);

    List<Device> selectDevices(Device device);

    List<Device> selectModelDevices(DeviceModelQueryVo device);

    List<DeviceModelDto> selectModelDeviceByArea(DeviceModelQueryVo device);

    /**
     * 通过设备编号查询设备
     */
    Device findOneByDeviceCode(String deviceCode);

    /**
     * 按照类型统计
     */
    Map<String, Long> getStatisticsByType(Device device);

    /**
     * 按照类型统计  类型下有设备的 且类型名不为空的
     */
    List<DeviceTypeCountVo> getStatisticsExistDeviceByType(Device device);

    /**
     * 统计 设备正常状态，总数
     */
    Map<String, Object> countDeviceByStatus(Device device);

    /**
     * 统计 设备在线状态  ,总数
     */
    Map<String, Object> countDeviceByOnlineState(Device device);

    /**
     * 统计设备数量
     */
    List<Map> getStatisticsDeviceCount(Page page, Device device);

    List<Map> getStatisticsDeviceAddUpCount(Page page, Device device);

    List<DeviceInfo> getDeviceStatisticsAudit(Device device);

    void insertDeviceInfo(DeviceInfo deviceInfo);

    void getDeviceStatisticsAuditTask(Device device);

    /**
     * 统计设备在线离线
     */
    List<Map> getStatisticsDeviceOnlineOffLine(Device device);

    List<Map<String, Object>> getDeviceCountByUnitCode(Device device);

    /**
     * 设备监控页-设备查询
     */
    IPage<Device> getMonitorPage(Page page, Device device);

    /**
     * 查询电力监控设备监控也
     *
     * @param distributionRoomId 配电房id
     * @return 设备列表
     */
    List<Device> getDistributionMonitorDevices(String distributionRoomId);

    /**
     * 设备地图页面渲染 标注设备位置所用
     * @param device
     * @return
     */
    List<Device>  getDeviceSiteInfos(Device device);

    /**
     * 设备地图页面渲染 标注设备位置所用
     * @param device
     * @return
     */
    IPage<Device> getDeviceSiteInfos(Page page, Device device);

    /**
     * 设备强制删除接口
     * @param deviceList
     */
    @Transactional(rollbackFor = Exception.class)
    void deleteBatchForce(List<Device> deviceList);

    /**
     * 检查设备被其他业务模块引用
     *
     * @param deviceId 设备id
     */
    boolean checkDeviceBeUsedByOtherBusiness(String deviceId);

    /**
     * 根据设备编号查询设备
     * @param deviceCodes 查询条件设备codes
     * @param device 查询条件 设备的字段
     */
    List<Device> selectDevicesByCodes(Set<String> deviceCodes, Device device);

    /**
     * 查询用户的所有摄像头设备
     * */
    List<Device> selectCameraDevices(String tenantId);

    void setAreaIds(Device device);

    /**
     * 按照空间分组统计，今日的告警的设备数（今日产生的）以及正常的设备数
     *
     * @param device
     * @return
     */
    List<Map<String, String>> statisticDeviceStatusCountBySpace(Device device);

    /**
     * 根据设备编号修改设备。
     * 注意实体中字段标记为strategy = FieldStrategy.IGNORED的设备，传null 则会修改为null
     *
     * @param device 设备实体
     * @param code   设备编号
     * @return 修改结果
     */
    boolean updateByCode(Device device, String code);

    /**
     * 按类型统计在线计数,各类别的总数多少在线数多少
     * @param device vo
     * @return
     */
    List<StatisticCountWithOnlineByTypeResult> statisticCountWithOnlineByType(Device device);


    /**
     * 按类型统计在线计数,各类别的总数多少在线数多少
     * @param countByDffAttrVo vo
     * @return
     */
    Map<String,Long> statisticCountWithDffAttr(CountByDffAttrVo countByDffAttrVo);

    List<String> selectDeviceCodes(DeviceQueryVo device);

    int deleteRepeatedDeviceAttrStatus();

    List<Device> getNotInModel(Integer modelId);

    boolean addToModel(Integer modelId, List<Device> devices);

    boolean removeFromModel(Integer modelId,List<DeviceModel> devices);

    boolean changeDeviceModelRemoveStatusByModel(Integer modelId, Device device);

    boolean changeDeviceModelRemoveStatus(Device device);

    List<Device> getWithElectricCheck(Device device);

    List<Device> getMonitorDevice(String tenantId, List<String> deviceUnitIds);

    List<DeviceVo> getModelDevice(Device device);

    /**
     * AI 智能预警获取相机下拉列表
     * @return
     */
    List<Device> getAiCameraList();

	List<Device> selectDevicesList(Device device);

    List<Device> selectByTypeNameDevicesList(Device device);

    void updateStatusById(String id, Integer status);

    /**
     * 按租户统计设备总数、在线数、离线数
     * @param tenantId 租户ID
     * @return 设备统计结果
     */
    DeviceStatisticsVo getDeviceStatisticsByTenantId();
}
